package com.hongji.lms5xxcommunicator.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hongji.lms5xxcommunicator.entity.ScanPointEntity;
import com.hongji.lms5xxcommunicator.grid.region.RegionRect;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.mapping.ResultSetType;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository
@Mapper
public interface ScanPointDataMapper extends BaseMapper<ScanPointEntity> {

    // 批量 UPSERT（XML 内 ON DUPLICATE KEY 覆盖）
    int insertBatchSomeColumn(@Param("epoch") long epoch,
                              @Param("list") List<ScanPointEntity> list);

    // 读时按会话网格聚合（固定存储格 -> 会话显示格）
    List<Map<String,Object>> selectCellsBySessionGrid(@Param("epoch") long epoch,
                                                      @Param("ix0") int ix0,
                                                      @Param("ix1") int ix1,
                                                      @Param("iy0") int iy0,
                                                      @Param("iy1") int iy1,
                                                      @Param("kx")  int kx,
                                                      @Param("ky")  int ky,
                                                      @Param("since") Long since,
                                                      @Param("limit") int limit,
                                                      @Param("offset") int offset);

    // 以下保持兼容（若别处用到）
    int upsertSnapshotBatch(@Param("epoch") long epoch,
                            @Param("list") List<ScanPointEntity> list,
                            @Param("frame") long frame);

    int deleteStaleByIx(@Param("epoch") long epoch, @Param("ix") int ix);

    List<ScanPointEntity> selectPageAfterId(@Param("lastId") Long lastId, @Param("limit") int limit);

    List<ScanPointEntity> selectByRegion(@Param("xMin") double xMin, @Param("xMax") double xMax,
                                         @Param("yMin") double yMin, @Param("yMax") double yMax,
                                         @Param("limit") int limit);

    @Options(fetchSize = Integer.MIN_VALUE, resultSetType = ResultSetType.FORWARD_ONLY)
    Cursor<ScanPointEntity> scanPointsCursor(@Param("xMin") double xMin, @Param("xMax") double xMax,
                                             @Param("yMin") double yMin, @Param("yMax") double yMax);

    // 在接口里追加这个方法（保留原来的 selectPageAfterId 不删）
    List<ScanPointEntity> selectPageAfterIdByEpoch(@Param("epoch") long epoch,
                                                   @Param("lastId") Long lastId,
                                                   @Param("limit") int limit);

    // ===== 新增：DB 侧带排除矩形的区域查询 =====
    List<ScanPointEntity> selectByRegionWithExcludes(@Param("xMin") double xMin,
                                                     @Param("xMax") double xMax,
                                                     @Param("yMin") double yMin,
                                                     @Param("yMax") double yMax,
                                                     @Param("excludes") List<RegionRect> excludes,
                                                     @Param("limit") int limit);
}
